CloudTrail全リージョン有効化の詳細と個別リージョン設定からの移行
はじめに
こんにちは、虎塚です。
2015年12月のAWSアップデートで、CloudTrailを全リージョンで有効化する機能が追加されました。
とはいえ、セキュリティや監査に注意を払っている環境では、すでにCloudTrailを各リージョンで設定して、有効に活用されている場合が多いと思います。
2016年1月、ソウルに新しいAWSリージョンがオープンしました。新リージョンをCloudTrailのロギング対象に加えるには、新リージョンで個別にCloudTrailを有効化するのがよいでしょうか? それとも、全リージョン有効化設定を使うべきでしょうか? 技術的には、どちらでも実現可能です。
この記事では、CloudTrailの全リージョン有効化設定の詳細を説明します。そして、各リージョンで個別に設定した既存のロギングから、全リージョン有効化設定を使ったロギングに移行する手順を紹介します。
CloudTrailの全リージョン有効化設定の詳細
あるリージョンでCloudTrailを有効化することは、そのリージョンでtrailというリソースを作成することを意味します。CloudTrailは、trailが作成されたリージョンでのAWS APIの操作について、ログを保存します。
CloudTrailの全リージョン有効化設定が導入されたことにともない、trailのデータ構造に次の値が増えました。
- IsMultiRegionTrail
- HomeRegion
IsMultiRegionTrailは、trailが単独のリージョンに属しているか (false) 、すべてのリージョンに存在するか (true) を表わします。そのtrailを全リージョンで有効化する場合は、trueになると考えてください。
HomeRegionは、trailが作成されたリージョンです。全リージョン有効化設定によって自動的に作成されたtrailのHomeRegionは、オリジナルのtrailのHomeRegionと同じになります(後述)。
具体例
東京リージョン (ap-northeast-1) でtrailを作成して (mytrail) 、全リージョン有効化設定をした場合、trailが次のように配置されます。
- ap-northeast-1
- trailが作成されます(この記事では、オリジナルのtrailと呼びます)
- ap-northeast-1以外のリージョン
- ap-northeast-1に作成されたtrailのshadow trailが自動的に作成されます
shadow trailは、東京リージョンに作成したtrailのレプリカです。shadow trailの設定値 (名前、ログファイルを格納するS3バケット、暗号化に使う鍵など) は、オリジナルのtrailとすべて同じです。異なる値を設定することはできません。
オリジナルのtrailとshadow trail
DescribeTrails APIを使うと、各リージョンに存在するオリジナルのtrailとshadow trailをすべて取得できます。
しかし、shadow trailの本体は、オリジナルのtrailが存在するリージョンにあります。そのため、たとえば、us-east-1に配置されたshadow trail (mytrail) に対して、DescribeTrailStatus APIを実行することはできません。us-east-1に「mytrail」というtrailは存在しないのです。AWS CLIでは、次のエラーになります。
A client error (TrailNotFoundException) occurred when calling the GetTrailStatus operation: Unknown trail: mytrail for the user: 123456789012
同様に、UpdateTrail APIで設定値を変更できるのは、オリジナルのtrailだけです。shadow trailの設定値をUpdateTrail APIで直接変更することはできません。
全リージョン有効化を無効にするとどうなるか
全リージョン有効化設定を一度trueにした後でfalseに変更すると、オリジナルのtrailだけを残し、そのほかのリージョンに配置されていたshadow trailは削除されます。
なお、shadow trailが配置されていたリージョンでのAWS API操作を記録したログファイルが、勝手に削除されてしまうことはありません。
全リージョン有効化設定の特徴
詳細が見えたところで、全リージョン有効化設定を使ってできることと、できないことをまとめてみます。
できること
- 将来追加されるリージョンにも、CloutTrailを自動的に有効化できます
- 将来リージョンが追加されるたびに、ClouTrailの設定を手動で追加する必要がありません
- 1つのS3バケットに複数のログファイルを集約できます
- CloudTrailログファイルへのアクセス制御を一括でおこなう場合、IAMポリシーを単純化できます
できないこと
- CloudTrailを全リージョン有効化設定した後に、一部のリージョンだけロギングを停止することはできません
- オリジナルのtrailだけ残して、ほかのtrailを削除することはできます
- ログファイルを格納するS3バケットを、リージョンごとに分けることはできません
全リージョン有効化設定をどんなときに使うべきか
リージョンごとにCloudTrailでやりたいことが細かく異なる場合には、全リージョン有効化設定は適しません。たとえば、CloudTrailを特定のリージョンでだけ使いたい場合や、ログファイルを格納するS3バケットを分けたい場合などです。それ以外のケースでは、全リージョン有効化設定を使いましょう。
ただし、リージョンごとに異なるロギング要件がある場合でも、いつもは使っていないリージョンでの意図しない操作や不正アクセスがないかを記録するために、全リージョン有効化設定を使ってtrailを設置しておいたほうがよいでしょう。
じつは、今回のアップデートと同時に、各リージョンで5個までtrailを設定できるようになりました。これまでは、各リージョンに作成できるtrailは1つだけでした。そのため、全リージョン有効化設定でtrailを各リージョンに1個作成しても、要件ごとのtrailを各リージョンに4個まで追加できます。保険として、全リージョン有効化設定によるtrailをかならず作成しておくのがおすすめです。
全リージョン有効化設定への移行手順
過去の設定を整理して、各リージョンで個別に作成したtrailによるロギングを、全リージョン有効化設定によるロギングに置き換えるには、次の手順を実施します。
- 新規にtrailを作成し、全リージョンで有効化する
- 既存のtrailを確認する
- 既存のtrailでロギングを停止する
- 既存のtrailを削除する
- 過去のtrailの関連リソースを保全または削除する
1の完了から3の完了までは、既存と新規のtrailが重複して存在するので、両方でロギングがおこなわれます。リージョンごとに5個までtrailを作成できるようになったおかげですね。つまり、設定の移行にあたって、CloudTrailによるロギングの停止期間を発生させずに済むので、ご安心ください。
1. 新規にtrailを作成し、全リージョンで有効化する
AWSブログにキャプチャつきで掲載されていますので、参照してください。
ただし、この記事を書いた時点で、Management Consoleからはtrailの作成時にログファイルの暗号化設定ができません。trailを一旦作成してから、オリジナルのtrailの設定を変更して暗号化を有効にするか、AWS CLIなどでtrailを作成する必要があります。
2. 既存のtrailを確認する
各リージョンで個別に設定した既存のtrailを確認します。全リージョン有効化設定がfalseのtrailだけに絞りこむには、次のコマンドを実行します(AWS CLIとjqを利用します)。
for region in $(aws ec2 describe-regions | jq -r ".Regions[].RegionName | @text") do echo "[$region]" ; aws --region $region cloudtrail describe-trails | jq '.trailList[] | if .IsMultiRegionTrail == false then .Name else empty end' ; done
今回のAWSアップデートによって過去の遺物となったブログ記事(CloudTrailの有効化とログのKMS暗号化をCloudFormation一発で)で設定したtrailが残っていると、たとえば、次のような実行結果になります。
[eu-west-1] "cloudtrail-eu-west-1-myTrail-XXXXXXXXXXXX" [ap-southeast-1] "cloudtrail-ap-southeast-1-myTrail-XXXXXXXXXXXX" [...]
上記が、停止候補のtrailです。正確には、trailのステータスの確認を省略しているので、すでに停止中のtrailも実行結果に含まれます。ステップ3以降の実行にあたっては特に問題ありません。
3. 既存のtrailでロギングを停止する
ステップ2で確認したtrailのロギングを停止するには、次のコマンドを実行します。
for region in $(aws ec2 describe-regions | jq -r ".Regions[].RegionName | @text") do for trail in $(aws --region $region cloudtrail describe-trails | jq -r '.trailList[] | if .IsMultiRegionTrail == false then .Name else empty end') do aws --region $region cloudtrail stop-logging --name $trail ; done done
4. 既存のtrailを削除する
次のコマンドを実行すると、全リージョン有効化設定がfalseのすべてのtrailを削除します。
for region in $(aws ec2 describe-regions | jq -r ".Regions[].RegionName | @text") do for trail in $(aws --region $region cloudtrail describe-trails | jq -r '.trailList[] | if .IsMultiRegionTrail == false then .Name else empty end') do aws --region $region cloudtrail delete-trail --name $trail ; done done
ステップ2の確認コマンドをもう一度実行して、削除対象のtrailが残っていないことを確認しましょう。
5. 過去のtrailの関連リソースを保全または削除する
trailに紐づくリソースには、次の2つがあります。
- ログファイルを格納するS3バケット
- KMSのカスタマーマスターキー
- ログファイルの暗号化を有効にした場合のみ
過去のCloudTrailログを保管しておく必要がある場合は、上記のリソースを今後も管理します。ログファイルを暗号化していた場合、誤ってKMSのキーを削除してしまうと、たとえログファイルがあっても復号できず閲覧できなくなりますので、注意してください。
過去のCloudTrailログが不要な場合は、trailを削除した後で、関連するリソースも削除しましょう。trailを停止/削除しても、上のリソースは環境に残りますので、手動で削除する必要があります。
以上で、個別リージョンに設定したtrailでのロギング設定から、全リージョン有効化設定を使ったロギングに移行できます。
おわりに
CloudTralの全リージョン有効化設定のおかげで一括でログが取れーるようになって、とても便利ですね。ぜひ活用してきましょう。
それでは、また。